# -*- coding: utf-8 -*-
"""
@Time    : 2024/9/10 16:14 
@Author  : ZhangShenao 
@File    : 1.元组的声明.py 
@Desc    : 元组的声明

元组tuple和列表list的功能类似,都可以用于存储多个元素
但是,tuple是Immutable不可修改的
也就是说,tuple一旦创建,其内部的元素就不可变

元组的优势:
1. 元组是Immutable不可变的,其内部状态无法修改,适合用于多线程环境下,天然就是线程安全的,可以免去很多线程同步操作的开销
2. 相较于列表,元组占用的内存更小,创建的速度也更快
3. 如果一个方法要返回多个值,使用元组也是不错的选择
"""
import sys

# 声明元组
t = (1, 2, "a", "b", "hello")
print(f"t = {t}")  # t = (1, 2, 'a', 'b', 'hello')

# 可以通过下标(索引)访问元组
print(f"t[0] = {t[0]}")  # t[0] = 1
print(f"t[-1] = {t[-1]}")  # t[-1] = hello

# 遍历元组中的元素
for v in t:
    print(v, end=" ")
print()

# 元组是Immutable,修改内部元素会报错
# t[0] = 3  # TypeError: 'tuple' object does not support item assignment

# 但是可以将变量重新指向新的元组
# 旧的元组将被垃圾收集器回收
t = (1, 2, 3)
print(f"t = {t}")  # t = (1, 2, 3)

# 可以通过构造函数,实现元组和列表的相互转换
fruit_list = ["apple", "banana", "orange", "pear"]
fruit_tuple = tuple(fruit_list)
print(f"fruit_tuple = {fruit_tuple}")
fruit_list1 = list(fruit_tuple)
print(f"fruit_list1 = {fruit_list1}")

# 在元素相同的情况下,元组比列表更加节省空间
print(f"元组占用的内存空间: {sys.getsizeof(fruit_tuple)}")  # 72
print(f"列表占用的内存空间: {sys.getsizeof(fruit_list)}")  # 88
